package bash

import (
	"strings"
	"time"

	"github.com/astaxie/beego/logs"
)

// 时间格式化函数
//
// 将当前时间格式化成规范的格式
//
// 支持0-1个参数，0时代表格式化成yyyy-MM-dd hh:mm:ss形式，否则格式化成指定形式
func Date(args ...string) string {
	return time.Now().Format(toArgs(args...))
}

// 时间格式化函数
//
// 将当前时间格式化成规范的格式
//
// times为int64格式的时间戳
// args支持0-1个附加参数参数，0时代表格式化成yyyy-MM-dd hh:mm:ss形式，否则格式化成指定形式
func DateFrom(times int64, args ...string) string {
	return time.Unix(times, 0).Format(toArgs(args...))
}

// 获取当前时间戳
func DateTime() int64 {
	return time.Now().Unix()
}

// 时间格式化成时间戳
//
// 将当前时间格式化成时间戳
//
// 支持1-2个参数，第一个参数为传入的时间格式，第二个参数为时间格式对应的yyyy格式
func DateToTime(args ...string) int64 {
	if len(args) == 1 {
		loc, _ := time.LoadLocation("Local")
		theTime, err := time.ParseInLocation(toArgs(), args[0], loc)
		if err != nil {
			logs.Error("时间" + args[0] + "格式化失败，原因：" + err.Error())
			return 0
		}
		return theTime.Unix()
	}
	loc, _ := time.LoadLocation("Local")
	theTime, err := time.ParseInLocation(toArgs(args[1]), args[0], loc)
	if err != nil {
		logs.Error("时间" + args[0] + "格式化失败，原因：" + err.Error())
		return 0
	}
	return theTime.Unix()
}

// 将传入的date参数格式化
//
// 传入0个时表示使用默认值yyyy-MM-dd hh:mm:ss格式
//
//	yyyy代表四位的年
//	MM代表两位的月
//	dd代表两位的日
//	hh代表两位的时
//	mm代表两位的分
//	ss代表两位的秒
func toArgs(args ...string) string {
	if len(args) == 0 {
		args = append(args, "yyyy-MM-dd hh:mm:ss")
	}
	str := func(str string, olds []string, news []string, rep int) string {
		for i, v := range olds {
			str = strings.Replace(str, v, news[i], rep)
		}
		return str
	}(strings.Join(args, ""), []string{
		"yyyy", "MM", "dd", "hh", "mm", "ss",
	}, []string{
		"2006", "01", "02", "15", "04", "05",
	}, -1)
	return str
}
